Amazon S3 Table の「メンテナンス」を設定してみた
こんにちは、製造ビジネステクノロジー部の若槻です。
re:Invent 2024 で、分析ワークロードに最適化された S3 ストレージをテーブル形式のデータとして提供する新サービス Amazon S3 Table が発表され、一般提供開始となりました。
この Amazon S3 Table にはテーブルの「メンテナンス」の概念があり、これによりテーブルを利用し続けるうえでのコスト削減やクエリパフォーマンスの向上を自動化することができます。
今回はこの Amazon S3 Table のメンテナンス構成を実際に設定してみました。
やってみた
現時点では Amazon S3 Table の設定項目の管理操作の多くはマネジメントコンソールからの実施がサポートされておらず、基本的に CLI や API で実施することになります。本記事では AWS CLI を使って各種設定を行ってみます。
環境の準備
Amazon S3 Tables を利用する際には、Table Bucket(テーブルバケット)、Namespace(ネームスペース) および Table(テーブル)の 3 つの要素を作成する必要があります。まずはこれらを CLI で作成して環境準備を行います。
テーブルバケットの作成
テーブルを S3 リソースとして作成および保存するために「テーブルバケット」というタイプの S3 バケットを作成します。バケット名は通常の S3 バケットとは異なりグローバルで一意である必要はなく、アカウントおよびリージョン内で一意でさえあればよいです。
REGION=us-east-1
BUCKET_NAME=wakatsuki-20241230
aws s3tables create-table-bucket \
--region ${REGION} \
--name ${BUCKET_NAME}
参考
ネームスペースの作成
テーブルバケット配下に「ネームスペース」という論理グループを作成します。テーブルはネームスペース内でグループ化されます。
NAME_SPACE=example_namespace
TABLE_BUCKET_ARN=arn:aws:s3tables:${REGION}:${ACCOUNT}:bucket/${BUCKET_NAME}
aws s3tables create-namespace \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--namespace ${NAME_SPACE} \
--region ${REGION}
参考
テーブルの作成
最後に「テーブル」をネームスペース配下に作成します。テーブルにテーブルデータと関連メタデータで構成される構造化データセットが保存されます。なお format
で指定可能なのは現時点では ICEBERG
(Apache Iceberg 形式) のみとなっています。
TABLE_NAME=example_table
aws s3tables create-table \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--namespace ${NAME_SPACE} \
--name ${TABLE_NAME} \
--format ICEBERG \
--region ${REGION}
コマンド実行後にマネジメントコンソールからもテーブルバケット内にテーブルが作成されていることを確認できました。
参考
メンテナンスジョブのステータス確認
メンテナンスはジョブにより自動化されており、そのステータスは aws s3tables get-table-maintenance-job-status
コマンドで確認できます。
$ aws s3tables get-table-maintenance-job-status \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--namespace ${NAME_SPACE} \
--name ${TABLE_NAME} \
--region ${REGION}
{
"tableARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230/table/0e4b2dad-b269-47be-9c39-2ed348ed1896",
"status": {
"icebergCompaction": {
"status": "Not_Yet_Run"
},
"icebergSnapshotManagement": {
"status": "Not_Yet_Run"
},
"icebergUnreferencedFileRemoval": {
"status": "Not_Yet_Run"
}
}
}
テーブル作成直後はまだどのジョブも実行されておらず、Not_Yet_Run
となっています。ジョブには以下の種類のステータスがあります。
Successful
:成功Failed
:失敗Disabled
:無効Not_Yet_Run
:未実行
またメンテナンス項目は以下のものがあります。これらをジョブとして自動実行するによりコストの削減やパフォーマンスの向上が図られます。
icebergCompaction
:Iceberg 形式ファイルの圧縮icebergSnapshotManagement
:Iceberg スナップショット管理icebergUnreferencedFileRemoval
:Iceberg 形式ファイルの参照されていないファイルの削除
また後述のメンテナンス構成の取得結果の通り、既定ではすべてのメンテンス項目が有効となっています。
参考
メンテナンス構成の取得、更新(テーブルバケットレベル)
メンテナンス構成にはテーブルバケットレベルとテーブルレベルの 2 つの設定があります。
テーブルバケットレベルの設定は icebergUnreferencedFileRemoval
(Iceberg 形式ファイルの参照されていないファイルの削除設定)となり、aws s3tables get-table-bucket-maintenance-configuration
コマンドで取得できます。
$ aws s3tables get-table-bucket-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--region ${REGION}
{
"tableBucketARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230",
"configuration": {
"icebergUnreferencedFileRemoval": {
"status": "enabled",
"settings": {
"icebergUnreferencedFileRemoval": {
"unreferencedDays": 3,
"nonCurrentDays": 10
}
}
}
}
}
既定では 3 日間未参照 (unreferencedDays) であれば非カレントとなり、10 日間非カレント (nonCurrentDays) であれば削除される設定となっています。
テーブルバケットレベルのメンテナンス構成の設定更新は aws s3tables put-table-bucket-maintenance-configuration
コマンドで行います。
$ aws s3tables put-table-bucket-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--type icebergUnreferencedFileRemoval \
--value='{"status":"disabled","settings":{"icebergUnreferencedFileRemoval": {"unreferencedDays":5,"nonCurrentDays":15}}}' \
--region ${REGION}
上記の例では icebergUnreferencedFileRemoval
を無効化し、未参照 5 日間、非カレント 15 日間で削除されるように設定を変更しています。設定結果を取得するとちゃんと変更が反映されていることが確認できます
$ aws s3tables get-table-bucket-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--region ${REGION}
{
"tableBucketARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230",
"configuration": {
"icebergUnreferencedFileRemoval": {
"status": "disabled",
"settings": {
"icebergUnreferencedFileRemoval": {
"unreferencedDays": 5,
"nonCurrentDays": 15
}
}
}
}
}
参考
メンテナンス構成の取得、更新(テーブルレベル)
テーブルレベルの設定は icebergCompaction
(Iceberg 形式ファイルの圧縮設定)と icebergSnapshotManagement
(Iceberg スナップショット管理設定)となり、aws s3tables get-table-maintenance-configuration
コマンドで取得できます。
$ aws s3tables get-table-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--namespace ${NAME_SPACE} \
--name ${TABLE_NAME} \
--region ${REGION}
{
"tableARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230/table/0e4b2dad-b269-47be-9c39-2ed348ed1896",
"configuration": {
"icebergCompaction": {
"status": "enabled",
"settings": {
"icebergCompaction": {
"targetFileSizeMB": 512
}
}
},
"icebergSnapshotManagement": {
"status": "enabled",
"settings": {
"icebergSnapshotManagement": {
"minSnapshotsToKeep": 1,
"maxSnapshotAgeHours": 120
}
}
}
}
}
既定では icebergCompaction
に基づきファイルあたり 512 MB となるように圧縮され、icebergSnapshotManagement
に基づき最低 1 つのスナップショットを保持し、スナップショットの最大保持期間は 120 時間となっています。
テーブルレベルのメンテナンス構成の設定更新は aws s3tables put-table-maintenance-configuration
コマンドで行います。
$ aws s3tables put-table-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--type icebergCompaction \
--namespace ${NAME_SPACE} \
--name ${TABLE_NAME} \
--value='{"status":"disabled","settings":{"icebergCompaction": {"targetFileSizeMB":256}}}' \
--region ${REGION}
上記の例では icebergCompaction
を無効化し、ファイルあたり 256 MB となるように設定を変更しています。設定結果を取得するとちゃんと変更が反映されていることが確認できます。
$ aws s3tables get-table-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--namespace ${NAME_SPACE} \
--name ${TABLE_NAME} \
--region ${REGION}
{
"tableARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230/table/0e4b2dad-b269-47be-9c39-2ed348ed1896",
"configuration": {
"icebergCompaction": {
"status": "disabled",
"settings": {
"icebergCompaction": {
"targetFileSizeMB": 256
}
}
},
"icebergSnapshotManagement": {
"status": "enabled",
"settings": {
"icebergSnapshotManagement": {
"minSnapshotsToKeep": 1,
"maxSnapshotAgeHours": 120
}
}
}
}
}
value
の指定に誤りがある場合は次のようなエラーになります。下記では JSON 構造の settings
に targetFileSizeMB
が指定されているが、icebergCompaction
または icebergSnapshotManagement
のいずれかである必要があるというエラーです。
$ aws s3tables put-table-maintenance-configuration \
--table-bucket-arn ${TABLE_BUCKET_ARN} \
--type icebergCompaction \
--namespace ${NAME_SPACE} \
--name ${TABLE_NAME} \
--value='{"status":"disabled","settings":{"targetFileSizeMB":512}}' \
--region ${REGION}
Parameter validation failed:
Unknown parameter in value.settings: "targetFileSizeMB", must be one of: icebergCompaction, icebergSnapshotManagement
参考
おわりに
Amazon S3 Table のメンテナンス構成を AWS CLI で設定してみました。これにより、テーブルのメンテナンスを自動化することでコスト削減やパフォーマンス向上を図ることができます。組織やシステムのポリシーに基づいて適切に設定を行い、効果的に活用していきましょう。
以上